#pragma once
#include <vector>
#include <Eigen/core>

namespace common {
    struct LineSegment
    {
        std::vector<Eigen::Vector3f> points_;//end points

        LineSegment() = default;
        LineSegment(const Eigen::Vector3f& p0, const Eigen::Vector3f& p1) {
            points_.resize(2);
            points_[0] = p0;
            points_[1] = p1;
        }
    };

    struct BezierCurve
    {
        std::vector<Eigen::Vector3f> points_;//control points

        BezierCurve() = default;
        BezierCurve(const Eigen::Vector3f& p0, const Eigen::Vector3f& p1, const Eigen::Vector3f& p2) {
            points_.resize(3);
            points_[0] = p0;
            points_[1] = p1;
            points_[2] = p2;
        }
    };

    struct AABB
    {
        Eigen::Vector3f min_, max_;

        AABB() = default;
        AABB(const Eigen::Vector3f & min, const Eigen::Vector3f & max)
            : min_(min) , max_(max) {}
    };

    AABB& CalcBoundingBox(const std::vector<Eigen::Vector3f>& points);
    bool isBoundingBoxOverlap(const std::vector<Eigen::Vector3f>& points_a, const std::vector<Eigen::Vector3f>& points_b);
}